package cn.lili.modules.member.entity.dos;

import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.security.sensitive.Sensitive;
import cn.lili.common.security.sensitive.enums.SensitiveStrategy;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import java.util.Date;

/**
 * 会员
 *
 * @author Bulbasaur
 * @since 2020-02-25 14:10:16
 */
@Data
@TableName("li_member")
@ApiModel(value = "会员")
@NoArgsConstructor
public class Member extends BaseEntity {

	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "会员用户名")
	private String username;

	@ApiModelProperty(value = "会员密码")
	private String password;

	@ApiModelProperty(value = "昵称")
	private String nickName;

	@Min(message = "会员性别参数错误", value = 0)
	@ApiModelProperty(value = "会员性别,1为男，0为女")
	private Integer sex;

	@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	@ApiModelProperty(value = "会员生日")
	private Date birthday;

	@ApiModelProperty(value = "会员地址ID")
	private String regionId;

	@ApiModelProperty(value = "会员地址")
	private String region;

	@NotEmpty(message = "手机号码不能为空")
	@ApiModelProperty(value = "手机号码", required = true)
	@Sensitive(strategy = SensitiveStrategy.PHONE)
	private String mobile;

	@Min(message = "必须为数字", value = 0)
	@ApiModelProperty(value = "积分数量")
	private Long point;

	@Min(message = "必须为数字", value = 0)
	@ApiModelProperty(value = "积分总数量")
	private Long totalPoint;

	@ApiModelProperty(value = "会员头像")
	private String face;

	@ApiModelProperty(value = "会员状态")
	private Boolean disabled;

	@ApiModelProperty(value = "是否开通店铺")
	private Boolean haveStore;

	@ApiModelProperty(value = "店铺ID")
	private String storeId;

	/**
	 * @see ClientTypeEnum
	 */
	@ApiModelProperty(value = "客户端")
	private String clientEnum;

	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
	@ApiModelProperty(value = "最后一次登录时间")
	private Date lastLoginDate;

	@ApiModelProperty(value = "会员等级ID")
	private String gradeId;

	@Min(message = "必须为数字", value = 0)
	@ApiModelProperty(value = "经验值数量")
	private Long experience;

	@ApiModelProperty(value = "会员标记  true 是  false 否")
	private Boolean memberFlag;

	@ApiModelProperty(value = "用户类型  1 商家  2 小程序用户")
	private Integer type;

	@ApiModelProperty(value = "推广码")
	private String promotionCode;

	@ApiModelProperty(value = "推广太阳码")
	private String promotionImg;

	@ApiModelProperty(value = "会员交会费时暂存的佣金数")
	private Double commission;

	@ApiModelProperty(value = "真实姓名")
	private String realName;

	@ApiModelProperty(value = "联系方式")
	private String linkMobile;

	@ApiModelProperty(value = "身份证号")
	private String idCardNumber;

	@ApiModelProperty(value = "支付密码")
	private String paymentPassword;

	@ApiModelProperty(value = "定位")
	private String location;

	@ApiModelProperty(value = "是否免密支付（ 0否 使用密码，1 是 免密支付）")
	private int noSecret;

	@ApiModelProperty(value = "户籍地")
	private String homeTown;

	@ApiModelProperty(value = "是否可以被绑定")
	private Boolean extensionFlag;

	public Member(String username, String password, String mobile) {
		this.username = username;
		this.password = password;
		this.mobile = mobile;
		this.nickName = mobile;
		this.disabled = true;
		this.haveStore = false;
		this.sex = 0;
		this.point = 0L;
		this.totalPoint = 0L;
		this.lastLoginDate = new Date();
		this.memberFlag = false;
		this.type = 2;
		this.promotionCode = null;
		this.noSecret = 0;
	}

	public Member(String username, String password, String mobile, String nickName, String face) {
		this.username = username;
		this.password = password;
		this.mobile = mobile;
		this.nickName = nickName;
		this.disabled = true;
		this.haveStore = false;
		this.face = face;
		this.sex = 0;
		this.point = 0L;
		this.totalPoint = 0L;
		this.lastLoginDate = new Date();
		this.memberFlag = false;
		this.type = 2;
		this.promotionCode = null;
		this.noSecret = 0;
	}

	public Member(String username, String password, String face, String nickName, Integer sex) {
		this.username = username;
		this.password = password;
		this.mobile = "";
		this.nickName = nickName;
		this.disabled = true;
		this.haveStore = false;
		this.face = face;
		this.sex = sex;
		this.point = 0L;
		this.totalPoint = 0L;
		this.lastLoginDate = new Date();
		this.memberFlag = false;
		this.type = 2;
		this.promotionCode = null;
		this.noSecret = 0;
	}
}
